package com.wenhao.newfeature;

import java.util.*;

/*
     Lambda表达式的标准格式：
         由三部分组成
             a：一些参数
             b:一个箭头
             c:一段代码
         格式：
            （参数列表）->(一些重写方法的代码);
          解释说明格式：
           （）：接口中抽象方法的参数列表，没有参数，就空着
             ->：传递的意思，把参数传递给方法体{}
            {}：重写接口的抽象方法的方法体
 */
public class lambda {

    public static void main(String[] args) {
        // 普通方法
        invokeCook(new Cook() {
            @Override
            public void makeFood() {
                System.out.println("cook is making food normally.");
            }
        });
        // 使用 lambda 表达式
        invokeCook(() -> {
            System.out.println("cook is making food using lambda.");
        });
        // 可以把大括号省略
        invokeCook(() -> System.out.println("no {}"));

        int[] array = new int[]{1,2,3,4,5};
        printArray(array);

        HashMap<String, String> map = new HashMap<>();
        map.put("1","2");
        map.put("3","4");
        map.put("5","6");
        printMap(map);
    }

    public static void invokeCook(Cook cook) {
        cook.makeFood();
    }

    public static void printArray (int[] array) {
        // 四种遍历方法
        // 直接for循环
        for (int i = 0;i < array.length;i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
        // 增强for循环
        for (int i : array) {
            System.out.print(i + " ");
        }
        System.out.println();
        // Lambda 表达式
        // forEach里面要传入一个消耗数字的方法
        // 传入一个数字但是不需要返回
        Arrays.stream(array).forEach(i -> System.out.print(i + " "));
        System.out.println();
        // Lambda 表达式 2
        Arrays.stream(array).forEach(System.out::print);
    }

    public static void printMap (Map<String,String> map) {
        // 第一种遍历方式(推荐，尤其是容量大时)
        for (Map.Entry<String,String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
        // 第二种 需要进行删除操作时
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> next = iterator.next();
            System.out.println(next.getKey() + ":" + next.getValue());
        }
        // lambda
        // 消耗2个值
        // 前面的值是key 后面的值是value
        map.forEach((value,key) -> {
            System.out.println(value + ":" + key);
        });
    }
}
interface Cook {
    void makeFood();
}
